package com.sinog.biz.service.business.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mongodb.client.result.DeleteResult;
import com.sinog.biz.mapper.havexml.UploadAppendixFileMapper;
import com.sinog.biz.mapper.havexml.ZcwjMapper;
import com.sinog.biz.service.business.ZcwjService;
import com.sinog.core.domain.Zcwj;
import com.sinog.core.model.UploadAppendixFile;
import com.sinog.core.model.ZcwjInfo;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.util.MapUtil;
import com.sinog.core.utilbean.Constants;
import com.sinog.core.utilbean.Result;
import com.sinog.core.utilbean.ReturnCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - ZcwjServiceImpl
 * @author zhangcb
 * @date -
 */
@Slf4j
@Service
public class ZcwjServiceImpl implements ZcwjService {

    @Resource
    private ZcwjMapper zcwjMapper;
    @Autowired
    @Qualifier("bujiJdbcTemplate")
    private JdbcTemplate bujiJdbcTemplate;
    @Resource
    private MongoTemplate mongoTemplate;
    @Resource
    private UploadAppendixFileMapper uploadAppendixFileMapper;

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 首页列表
     * @param departId departId
     * @param level level
     * @param account account
     * @param username username
     * @return List<HashMap < String,Object>>
     */
    @Override
    public List<HashMap<String,Object>> getSyZcwjList(String departId,String level,String account,String username) {
        level = level.replaceAll("^(0+)","");
        return zcwjMapper.getSyZcwjList(departId,level,account,username);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 列表
     * @param pageIndex pageIndex
     * @param pageSize pageSize
     * @param mapkey mapkey
     * @return Page<Map < String,String>>
     */
    @Override
    public Page<Map<String,String>> getZcwjInfoList(Integer pageIndex,Integer pageSize,Map<String,Object> mapkey) {
        MapUtil.requestConversionToMap(mapkey);
        Page<Map<String,String>> page = new Page<>(pageIndex + 1,pageSize);
        return page.setRecords(zcwjMapper.getZcwjInfoList(page,mapkey));
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - （修改/新增）
     * @param data data
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveZcwjInfo(String data) {
        //参数实体
        Zcwj zcwj = JsonUtil.toBean(data,Zcwj.class);
        //数据库查询实体
        Zcwj zcwj1 = zcwj.selectById(zcwj.getId());
        //更新
        Date date = new Date();
        if(null == zcwj1){
            zcwj.setAddtime(date);
        }
        zcwj.setEdittime(date);
        boolean flag = zcwj.insertOrUpdate();
        if(flag) {
            ZcwjInfo zcwjInfo = JsonUtil.toBean(data,ZcwjInfo.class);
            zcwjInfo.setAddtime(date);
            try {
                mongoTemplate.save(zcwjInfo,"zcwjInfo");
                return true;
            } catch(DataAccessResourceFailureException e) {
                log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
                //如果mongodb发生错误，回滚mysq事务
                throw new RuntimeException("mongodb服务器连接异常");
            } catch(RuntimeException e) {
                log.error("发生异常:{}",e.getMessage());
                //如果mongodb发生错误，回滚mysq事务
                throw new RuntimeException("mongodb服务器连接异常");
            }
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 删除
     * @param id id
     * @return boolean
     */
    @Override
    public boolean deleteZcwjInfo(String id) {
        log.debug("to delete zcwjinfo :{}",id);
        //删除MongoDB中政策文件对应数据
        Query query = new Query(Criteria.where("_id").is(id));
        DeleteResult result;
        try {
            result = mongoTemplate.remove(query,ZcwjInfo.class);
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
            return false;
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
            return false;
        }
        long count = result.getDeletedCount();
        boolean flag;
        if(0 < count) {
            //删除政策文件表
            Zcwj zcwj = new Zcwj();
            zcwj.setId(id);
            flag = zcwj.deleteById(id);
            return flag;
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 获取附件list数据
     * @param map map
     * @return List<UploadAppendixFile>
     */
    @Override
    public List<UploadAppendixFile> getFilesListdata(Map<String,Object> map) {
        return uploadAppendixFileMapper.getFilesListdataZcwj(map);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 获取是否是自己发布的
     * @param map map
     * @return int
     */
    @Override
    public int checkIfOwnerPublish(Map<String,Object> map) {
        return zcwjMapper.checkIfOwnerPublish(map);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 删除附件
     * @param map map
     * @return int
     */
    @Override
    public int deleteFjByid(Map<String,Object> map) {
        return uploadAppendixFileMapper.deleteFjByidZcwj(map);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 发布/取消发布
     * @param id id
     * @param stateValue stateValue
     * @return Result
     */
    @Override
    public Result setfabuState(String id,String stateValue) {
        Zcwj zcwj = new Zcwj();
        Zcwj fabuStateInfo = zcwj.selectById(id);
        fabuStateInfo.setFabustate(stateValue);
        if(Constants.NumberStr.NUM_STR_ZERO.equals(stateValue)){
            fabuStateInfo.setFabutime(null);
        } else {
            fabuStateInfo.setFabutime(new Date());
        }
        boolean tag = fabuStateInfo.insertOrUpdate();
        if(tag) {
            return Result.success();
        }
        return Result.failure(ReturnCode.FAILURE);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - 获取部级附件list数据
     * @param map map
     * @return List<UploadAppendixFile>
     */
    @Override
    public List<UploadAppendixFile> getBjFilesListdata(Map<String,Object> map) {
        //自定义rowMapper
        RowMapper<UploadAppendixFile> rowMapper = new BeanPropertyRowMapper<>(UploadAppendixFile.class);
        try {
            return bujiJdbcTemplate.query("SELECT * FROM upload_appendix_file u WHERE u.id = ? AND task_id = ?",rowMapper,map.get("id"),map.get("taskId"));
        } catch(DataAccessException e) {
            return new ArrayList<>(16);
        }
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 政策文件 - mongodb获取政务文件信息
     * @param id id
     * @return ZcwjInfo
     */
    @Override
    public ZcwjInfo findZcwjById(String id) {
        ZcwjInfo zcwjInfo = null;
        try {
            zcwjInfo = mongoTemplate.findById(id,ZcwjInfo.class);
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
        }
        return zcwjInfo;
    }
}